package com.example.manual

import android.Manifest
import android.content.ContentValues
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.Build
import android.provider.MediaStore
import android.util.Log
import android.widget.Toast
import androidx.annotation.NonNull
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import java.io.File

class MainActivity : FlutterActivity() {
    /* 
    CHANNEL：定义 Flutter 与原生通信的通道名称，Flutter 端会通过这个名称找到对应的通道。
    PERMISSION_REQUEST_CODE：用于处理权限请求结果的标识符。

    调试kotlin 日志
    终端 adb shell 
    logcat | grey [过滤条件]
    */
    private val CHANNEL = "native_gallery_saver"
    private val PERMISSION_REQUEST_CODE = 1


    /* 
    配置通道：configureFlutterEngine 是 Flutter 调用的入口。
    注册通道方法：
        MethodChannel：创建一个通道，监听 Flutter 发来的方法调用。
        call.method：判断 Flutter 调用的具体方法。
    参数处理：
        使用 call.argument("filePath") 获取 Flutter 传来的参数。
        如果 filePath 是空值，返回错误 INVALID_ARGUMENT。
    */
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            when (call.method) {
                "saveToGallery" -> {
                    val filePath: String? = call.argument("filePath")
                    if (filePath.isNullOrEmpty()) {
                        result.error("INVALID_ARGUMENT", "File path is null or empty", null)
                        return@setMethodCallHandler
                    }
                    /* 
                    权限检查：调用 checkAndRequestPermissions() 检查是否有存储权限。
                        如果权限被允许，则继续保存图片。
                        否则返回 PERMISSION_DENIED 错误。
                    保存图片：
                        调用 saveImageToGallery(filePath) 执行保存操作。
                        如果成功，返回 result.success(true)，否则返回错误 SAVE_FAILED。
                    */
                    if (checkAndRequestPermissions()) {
                        val saveResult = saveImageToGallery(filePath)
                        if (saveResult) {
                            result.success(true)
                        } else {
                            result.error("SAVE_FAILED", "Failed to save the image", null)
                        }
                    } else {
                        result.error("PERMISSION_DENIED", "Storage permissions are required", null)
                    }
                }
                else -> result.notImplemented()
            }
        }
    }
    /* 
    保存图片的核心逻辑  文件检查：
        使用 File(filePath) 创建文件对象。
        如果文件不存在，记录日志并返回 false。
    */
    private fun saveImageToGallery(filePath: String): Boolean {
        return try {
            val file = File(filePath)
            if (!file.exists()) {
                Log.e("MainActivity", "File does not exist: $filePath")
                return false
            }
            // 位图解码：使用 BitmapFactory.decodeFile 读取文件并创建 Bitmap 对象。
            val bitmap = BitmapFactory.decodeFile(file.absolutePath)
            // 内容配置：
            // ContentValues：用于存储图片的元信息，例如名称和 MIME 类型。
            // Android 10（Q）及以上，使用 RELATIVE_PATH 将图片保存到 Pictures/MyApp 文件夹。
            val contentValues = ContentValues().apply {
                put(MediaStore.Images.Media.DISPLAY_NAME, file.name)
                put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/MyApp")
                    put(MediaStore.Images.Media.IS_PENDING, 1)
                }
            }
            // 保存图片到媒体库：
            // contentResolver.insert：将 ContentValues 插入到媒体存储（MediaStore.Images.Media.EXTERNAL_CONTENT_URI）。
            // 打开输出流并使用 bitmap.compress 将位图写入目标位置。
            // 如果是 Android 10（Q）及以上，更新 IS_PENDING 标志。
            val uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
            if (uri != null) {
                contentResolver.openOutputStream(uri)?.use { outputStream ->
                    if (bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                            contentValues.clear()
                            contentValues.put(MediaStore.Images.Media.IS_PENDING, 0)
                            contentResolver.update(uri, contentValues, null, null)
                        }
                        Log.d("MainActivity", "Image saved to gallery: $uri")
                        true
                    } else {
                        Log.e("MainActivity", "Failed to compress bitmap")
                        false
                    }
                } ?: false
            } else {
                // 失败处理：如果 URI 为 null 或压缩失败，则记录日志并返回 false。
                Log.e("MainActivity", "Failed to get content URI")
                false
            }
        } catch (e: Exception) {
            Log.e("MainActivity", "Error saving image: ${e.message}")
            false
        }
    }
    /* 
    Android 10 及以上：不需要额外权限，直接返回 true。
    低版本权限检查：
    检查 WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE 权限。
    如果缺少权限，调用 ActivityCompat.requestPermissions 申请。
    */
    private fun checkAndRequestPermissions(): Boolean {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            true
        } else {
            val permissions = arrayOf(
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE
            )
            val missingPermissions = permissions.filter {
                ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
            }
            if (missingPermissions.isNotEmpty()) {
                ActivityCompat.requestPermissions(this, missingPermissions.toTypedArray(), PERMISSION_REQUEST_CODE)
                false
            } else {
                true
            }
        }
    }
    /* 
    处理权限结果：
    匹配请求码 PERMISSION_REQUEST_CODE。
    如果所有权限被授予，显示 Toast 并记录日志。
    否则显示拒绝提示。
     */
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.isNotEmpty() && grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
                Toast.makeText(this, "Permissions granted", Toast.LENGTH_SHORT).show()
                Log.d("MainActivity", "All permissions granted")
            } else {
                Toast.makeText(this, "Permissions denied", Toast.LENGTH_SHORT).show()
                Log.e("MainActivity", "Permissions denied")
            }
        }
    }
}
